//
//  CZOauthViewController.swift
//  GZWeibo009
//
//  Created by gzxzmac on 16/3/21.
//  Copyright © 2016年 gzxzmac. All rights reserved.
//

import UIKit

import SVProgressHUD

class CZOauthViewController: UIViewController {
    
    override func loadView() {
        // 在这里设置控制器的view为webView的好处是后面需要添加约束,自己会和屏幕一样大
        view = webView
        
        webView.delegate = self
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //        // 添加webView
        //        self.view.addSubview(webView)
        //        // 设置webView的约束
        
        // 没有背景颜色,在Modal的时候只看的到导航栏
        view.backgroundColor = UIColor.whiteColor()
        
        // 设置导航栏
        setupNavigationBar()
        
        // 使用webView加载登陆界面
        let urlString = "https://api.weibo.com/oauth2/authorize?client_id=\(client_id)&redirect_uri=\(redirect_uri)"
        let url = NSURL(string: urlString) // 登陆界面的url需要查看api文档
        let request = NSURLRequest(URL: url!)
        webView.loadRequest(request)
        
        // 弹出正在加载的提示
        // showWithStatus,需要主动关闭
        SVProgressHUD.showWithStatus("正在加载", maskType: SVProgressHUDMaskType.None)
        
        // showInfoWithStatus,会自动关闭
        //        SVProgressHUD.showInfoWithStatus("正在加载", maskType: SVProgressHUDMaskType.Clear)
        //        SVProgressHUD.showErrorWithStatus("正在加载")
    }
    
    /// 设置导航栏
    private func setupNavigationBar() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "填充", style: UIBarButtonItemStyle.Plain, target: self, action: "autoFill")
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
    }
    
    // MARK: - 点击的方法
    @objc private func autoFill() {
        // js代码的字符串
        let jsCode = "document.getElementById('userId').value='495365458@qq.com';document.getElementById('passwd').value='ken010443'"
        
        // 执行js代码
        webView.stringByEvaluatingJavaScriptFromString(jsCode)
    }
    
    /// 关闭控制器
    @objc private func close() {
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    // MARK: - 懒加载
    /// webView
    private lazy var webView: UIWebView = UIWebView()
}

// MARK: - 扩展 CZOauthViewController 实现 UIWebViewDelegate
extension CZOauthViewController: UIWebViewDelegate {
    func webViewDidFinishLoad(webView: UIWebView) {
        // 关闭提示
        SVProgressHUD.dismiss()
    }
    
    // webView是否需要加载某个请求
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {   // true 表示加载这个地址,false就不加载
        let urlString = request.URL!.absoluteString
        CZPrint(msg: "urlString: \(urlString)")
        
        // 点击取消: "http://www.baidu.com/?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330"
        
        // 点击授权: "http://www.baidu.com/?code=e67b175d1dff25aa630f0b1b74daa3f5"
        
        // 当点击了取消后授权后都会加载授权回调地址,所以判断如果是授权回调地址就表示点击的是 取消 或 授权
        // 不是授权回调地址,让他加载
        if !urlString.hasPrefix(redirect_uri) {
            return true
        } else {
            // 加载的授权回调地址,说明点击的是 取消 或 授权
            // 获取参数
            // query: get请求?后面的参数
            let query = request.URL?.query
            
            // 判断query是否以code=开头
            let codeString = "code="
            if query!.hasPrefix(codeString) {
                // 点击的是 授权
                // "code=b2e409e0c79fa29dd9a3dc903f18ca73"
                // 截取query里面的code
                let nsQuery = query! as NSString
                let code = nsQuery.substringFromIndex(codeString.characters.count)
                print("code: \(code)")
                
                /// 3.准备好闭包
                CZUserAccountViewModel.sharedInstance.loadAccessToken(code, completion: { (error) -> () in
                    // 判断是否有错
                    if error != nil {
                        print("error: \(error)")
                        SVProgressHUD.showErrorWithStatus("获取AccessToken失败")
                        
                        // 延迟1秒再关闭
                        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
                            self.close()
                        })
                        return
                    }
                    
                    // 没有错误
                    // 关闭控制器
                    print("没有错误关闭控制器")
                    self.close()
                    
                    // 切换控制器
                    AppDelegate.outSwitchRootViewController(CZWelcomeViewController())
                    //                    let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate
                    //                    appDelegate?.switchRootViewController(CZWelcomeViewController())
                    //                    appDelegate?.window?.rootViewController = CZWelcomeViewController()
                })
            } else {
                // 点击的是取消
                // 关闭界面
                close()
            }
            
            return false
        }
    }
    
    /*
    MVVM
    MVC控制器管的事情太多了会导致控制器代码太多.逻辑太复杂了.不方便代码的维护
    VM专门来负责模型相关的操作
    */
    
    //    /// 加载 access_token, post
    //    func loadAccessToken(code: String) {
    //        // 获取accessToken的url
    //        let urlString = "https://api.weibo.com/oauth2/access_token"
    //
    //        // 拼接参数
    //        let parameters = [
    //            "client_id" : client_id,
    //            "client_secret" : client_secret,
    //            "grant_type" : "authorization_code",
    //            "code" : code,
    //            "redirect_uri" : redirect_uri
    //        ]
    //
    //        // 发送请求
    //        /*
    //            AFN.POST:
    //                1.请求的url地址
    //                2.请求参数
    //        */
    //        CZNetworkTool.sharedInstance.afnManager.POST(urlString, parameters: parameters, progress: nil, success: { (_, result) -> Void in // 1.NSURLSessionDataTask: task 2.响应结果
    //                print("result: \(result)")
    //                // 将accessToken保存起来,下次直接拿来用,省得用户每次进入都需要登录
    //                if let dict = result as? [String: AnyObject] {
    //                    let userAccount = CZUserAccount(dict: dict)
    //                    print("userAccount: \(userAccount)")
    //
    //                    // 保存模型到沙盒
    //
    //                    // 从沙盒加载数据
    //
    //                    // 判断是否过期
    //                }
    //            }) { (_, error) -> Void in // 1.task 2.响应失败的原因
    //                print("请求accesstoken失败 \(error)")
    //        }
    //    }
}